feat: add sanitized diagnostics log bundle#562
Conversation
|
Codex review: needs changes before merge. Reviewed June 27, 2026, 12:37 AM ET / 04:37 UTC. Summary Reproducibility: yes. for the review finding: the PR source treats the broad key fragment Review metrics: 3 noteworthy metrics.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Fix the harmless node-count over-redaction, then land only after maintainers accept the diagnostics privacy boundary, summary-only support workflow change, and cache-state changes or split the unrelated cache work out. Do we have a high-confidence way to reproduce the issue? Yes for the review finding: the PR source treats the broad key fragment Is this the best way to solve the issue? Unclear as the final product path: the side-effect-free bounded export design matches the reviewer guidance, but the summary-only support workflow, privacy boundary, and cache-state changes need maintainer acceptance. The narrow node-count over-redaction should be fixed before merge. Full review comments:
Overall correctness: patch is correct AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 8b5ea3294b33. Label changesLabel justifications:
Evidence reviewedAcceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
ClawSweeper PR egg 🔥 Warming up: real-behavior proof passed; findings, security review, or rank-up moves are still in progress. Hatch commandComment Hatchability rules:
What is this egg doing here?
|
There was a problem hiding this comment.
Pull request overview
This PR adds a sanitized “diagnostics bundle” export flow for the WinUI tray app, including robust redaction of secrets/identifiers and expanded bundle contents (log tails + structured diagnostics + crash/setup tails + connection timeline), along with new regression tests and a Win32-native “Save as” dialog for self-hosted WinUI.
Changes:
- Introduce
DiagnosticsExportRedactorand apply it to bundle generation and log tail reading (including final “whole-bundle” sanitization). - Add
DiagnosticsBundleBuilder+DiagnosticsLogTailReaderand update the debug/diagnostics UI to preview/copy/save the sanitized bundle. - Add new Shared/Tray tests covering redaction shapes, split-line secrets, missing files behavior, and bundle safety guarantees.
Show a summary per file
| File | Description |
|---|---|
| tests/OpenClaw.Tray.Tests/OpenClaw.Tray.Tests.csproj | Links new WinUI diagnostics services/helpers into Tray test project. |
| tests/OpenClaw.Tray.Tests/DiagnosticsPageContractTests.cs | Adds contract tests to enforce “summary-only vs full bundle” UX boundaries. |
| tests/OpenClaw.Tray.Tests/DiagnosticsBundleBuilderTests.cs | Adds tests for bundle contents, missing-file behavior, and split-line redaction. |
| tests/OpenClaw.Shared.Tests/DiagnosticsExportRedactorTests.cs | Adds broad regression coverage for redaction patterns and context preservation. |
| src/OpenClaw.Tray.WinUI/Windows/DiagnosticsBundleDialog.xaml.cs | Reworks Save flow to use Win32 picker + deferral so errors surface in UI. |
| src/OpenClaw.Tray.WinUI/Windows/DiagnosticsBundleDialog.xaml | Replaces InfoBar with a custom “review before sharing” card-style header. |
| src/OpenClaw.Tray.WinUI/Strings/en-us/Resources.resw | Updates strings for “summary debug bundle” and new dialog header UIDs. |
| src/OpenClaw.Tray.WinUI/Strings/fr-fr/Resources.resw | Same localization updates as en-us. |
| src/OpenClaw.Tray.WinUI/Strings/nl-nl/Resources.resw | Same localization updates as en-us. |
| src/OpenClaw.Tray.WinUI/Strings/zh-cn/Resources.resw | Same localization updates as en-us. |
| src/OpenClaw.Tray.WinUI/Strings/zh-tw/Resources.resw | Same localization updates as en-us. |
| src/OpenClaw.Tray.WinUI/Services/DiagnosticsLogTailReader.cs | Adds sanitized + truncated log tail reader for bundle sections. |
| src/OpenClaw.Tray.WinUI/Services/DiagnosticsClipboardService.cs | Renames “debug bundle” copy label to “summary debug bundle”. |
| src/OpenClaw.Tray.WinUI/Services/DiagnosticsBundleBuilder.cs | Adds full bundle builder composing summaries, timeline, and sanitized tails. |
| src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs | Wires diagnostics bundle preview flow and copy actions. |
| src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml | Updates UX copy to “Copy summary debug bundle” with exclusions noted. |
| src/OpenClaw.Tray.WinUI/Helpers/Win32FilePickerHelper.cs | Adds Win32 Save dialog via COM IFileSaveDialog on STA thread. |
| src/OpenClaw.Tray.WinUI/App.xaml.cs | Exposes recent connection diagnostic events for bundling. |
| src/OpenClaw.Shared/DiagnosticsExportRedactor.cs | Adds centralized regex-based redaction for bundles/log exports. |
Copilot's findings
Tip
Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- Files reviewed: 19/19 changed files
- Comments generated: 9
|
This direction makes sense for a shareable diagnostics bundle, but the redactor is carrying a lot of regex responsibility in one place. I would not block solely because it uses regex — conservative over-redaction is probably right here — but I think it needs a maintainability/perf pass before merge: group the rules by threat class, consider source-generated regexes or clearly named rule objects, and add a worst-case/perf regression test so a long log line or malformed URL/token cannot cause pathological backtracking. The current test coverage for common secret shapes is good; my concern is mostly long-term maintainability and worst-case behavior. |
|
I took a closer pass on the redaction implementation. The feature is valuable and regex is not inherently the wrong tool for free-form diagnostics, but I think this needs a small reliability/perf cleanup before merge. Concrete concerns:
Longer-term, because this is |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
latest proof: full bundle, copy/paste: full diagnostics bundle .txt, after clicking "save to file": summary bundle: for local validation: build + shared tests + tray tests passed on the latest commit. |
|
Fresh current-head proof for diagnostics bundle flow at
Local validation on this head already passed: Artifacts prepared for attachment:
|
|
Text artifacts for the fresh current-head proof are also available here: https://gist.github.com/christineyan4/93b473224ce4349cbbb11087b97cc74a Included:
The local screenshot artifacts prepared for upload are:
The text artifacts show current-head full copy/save output and summary-only content; full copy and save outputs are byte-identical, include sanitized log tails, and the summary artifact excludes log-tail sections. |
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. |
|
Updated proof gist now contains all five current-head artifacts: https://gist.github.com/christineyan4/93b473224ce4349cbbb11087b97cc74a Files:
|
Port PR openclaw#562 onto current main and harden diagnostics redaction so JSONL remains parseable while sensitive values, metadata keys, paths, emails, headers, and compound JSON values are sanitized before export. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>





Summary
DiagnosticsExportRedactorkept as defense-in-depth for older/raw export text.\u0022and escaped CRLFs before final redaction, while keeping plain Windows paths stable and guarding control/backslash unicode escapes.[REDACTED_SANITIZER_TIMEOUT]instead of aborting export.Validation
dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore --filter FullyQualifiedName~DiagnosticsExportRedactorTestsdotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter "FullyQualifiedName~DiagnosticsBundleBuilderTests|FullyQualifiedName~DiagnosticsPageContractTests".\build.ps1dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restoredotnet test .\tests\OpenClaw.Connection.Tests\OpenClaw.Connection.Tests.csproj --no-restoregit diff --check